package br.com.velp.sudecap.mb.decreto;

import br.com.velp.sudecap.comum.BaseController;
import br.com.velp.sudecap.comum.InterfaceConsulta;
import br.com.velp.sudecap.datamodel.DecretoDataModel;
import br.com.velp.sudecap.dto.DecretoParametrosConsultaDTO;
import br.com.velp.sudecap.entidade.Decreto;
import br.com.velp.sudecap.enumerator.PaginaEnum;
import br.com.velp.sudecap.enumerator.TipoDecretoEnum;
import br.com.velp.sudecap.enumerator.TipoPeriodoDecretoEnum;
import br.com.velp.sudecap.service.DecretoService;
import br.com.velp.sudecap.web.util.MensagemUtil;
import java.util.List;
import javax.faces.bean.ApplicationScoped;
import javax.faces.model.SelectItem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.stereotype.Controller;

/**
 * <sumario>
 * <objetivo> "Rastreabilidade" </objetivo>
 * <autor> EDUARDO SANTOS DE OLIVEIRA </autor>
 * <versao>1.0.0.0</versao>
 * <data_criacao> 17.10.2012 </data_criacao>
 * <data_ultima_alteracao> N/A </data_ultima_alteracao>
 * <requisito_afetado> RF006.01 - Listar Decretos </requisito_afetado>
 * <descricao> Managead Bean responsável por controlar as 
 * operações de Consulta/Exclusão de Decretos </descricao>
 * </sumario>
 */
@Controller("consultarDecreto")
@ApplicationScoped
public class ConsultarDecreto extends BaseController implements InterfaceConsulta {

    public static final Long serialVersionUID = 1L;
    private static final String FK_DECRETO_REVOGACAO = "FK_DECRETO_DECRETO";
    private static final String FK_DECRETO_RERATIFICACAO_1 = "FK_RERATIFICACAO_DECRETO_1";
    private static final String FK_DECRETO_RERATIFICACAO_2 = "FK_RERATIFICACAO_DECRETO_2";
    
    private DecretoDataModel dataModel;
    private DecretoParametrosConsultaDTO parametros;
    private Decreto decretoSelecionado;
    private List<SelectItem> listaTiposPeriodo;
    private List<SelectItem> listaTiposDecreto;
    private Decreto[] decretosSelecionados;
    
    @Autowired
    private DecretoService decretoService;

    @Override
    public String setup() {

	limparCampos();
	this.listaTiposPeriodo = obterSelectItemPopulado(false, TipoPeriodoDecretoEnum.values());
	this.listaTiposDecreto = obterSelectItemPopulado(true, TipoDecretoEnum.values());

	return PaginaEnum.CONSULTAR_DECRETO.getValue();

    }

    @Override
    public String pesquisar() {

	this.dataModel = new DecretoDataModel(this.decretoService, this.parametros);

	return null;

    }

    @Override
    public String excluir() {

	try {
	    this.decretoService.excluir(this.decretoSelecionado);
	    MensagemUtil.exibirMensagemInformacao("global", MensagemUtil.getMensagem("decretoExcluidoSucesso"));
	} catch (DataIntegrityViolationException ex) {
	    if (ex.getMessage().contains(FK_DECRETO_REVOGACAO)) {
		MensagemUtil.exibirMensagemErro("global", MensagemUtil.getMensagem("decretoMsgNaoEhPossivelExcluir"));
	    } else if (ex.getMessage().contains(FK_DECRETO_RERATIFICACAO_1) 
		    || ex.getMessage().contains(FK_DECRETO_RERATIFICACAO_2)) {
		MensagemUtil.exibirMensagemErro("global", MensagemUtil.getMensagem("decretoMsgNaoEhPossivelExcluir2"));
	    }else{
		MensagemUtil.exibirMensagemErro("global", MensagemUtil.getMensagem("decretoMsgNaoEhPossivelExcluir3"));
	    }
	} catch (Exception ex) {
	    MensagemUtil.exibirMensagemErro("global", ex.getMessage());
	}

	return null;

    }

    @Override
    public String voltar() {

	return PaginaEnum.PAGINA_PRINCIPAL.getValue();

    }

    public void limparCampos() {

	this.parametros = new DecretoParametrosConsultaDTO();
	this.parametros.setTipoPeriodo(TipoPeriodoDecretoEnum.PERIODO_PUBLICACAO.getValue());
	this.decretosSelecionados = null;
	this.dataModel = null;

    }

    // <editor-fold desc="GETTERS AND SETTERS" defaultstate="collapsed">        
    public DecretoDataModel getDataModel() {
	return dataModel;
    }

    public void setDataModel(DecretoDataModel dataModel) {
	this.dataModel = dataModel;
    }

    public Decreto getDecretoSelecionado() {
	return decretoSelecionado;
    }

    public void setDecretoSelecionado(Decreto decretoSelecionado) {
	this.decretoSelecionado = decretoSelecionado;
    }

    public DecretoParametrosConsultaDTO getParametros() {
	return parametros;
    }

    public void setParametros(DecretoParametrosConsultaDTO parametros) {
	this.parametros = parametros;
    }

    public List<SelectItem> getListaTiposPeriodo() {
	return listaTiposPeriodo;
    }

    public void setListaTiposPeriodo(List<SelectItem> listaTiposPeriodo) {
	this.listaTiposPeriodo = listaTiposPeriodo;
    }

    public List<SelectItem> getListaTiposDecreto() {
	return listaTiposDecreto;
    }

    public void setListaTiposDecreto(List<SelectItem> listaTiposDecreto) {
	this.listaTiposDecreto = listaTiposDecreto;
    }
    
    public Decreto[] getDecretosSelecionados() {
	return decretosSelecionados;
    }

    public void setDecretosSelecionados(Decreto[] decretosSelecionados) {
	this.decretosSelecionados = decretosSelecionados;
    }
    // </editor-fold>    
    
}
